# @Time : 2024-10-25 13:41
# @Author : Fioman 
# @Phone : 13149920693
"""
dict  和 set 是基于哈希表来实现的的可变类型.
哈希表是一种常数实践进行查找,插入,删除的高效数据结构.
哈希表将键(对于dict)或者元素(对于set)转换为一个hash值,存储在底层的一个数组中,然后如果出现了哈希冲突
通过开放寻址法或者拉链法来解决冲突.
可变: 可变类型是内容是可变对象,可以在原地进行修改内容,而不创建新的变量
         list dict set bytearray arrary  deque
不可变: 不可变类型是指对象的内容不能原地修改,如果修改了就会创建新的变量
"""
myDict = {'a': 1}
print(id(myDict))
myDict["b"] = 2  # 修改内容,地址不变
print(id(myDict))

s = set()  # 但是集合中的元素必须是可哈希的,所以集合中的元素可以作为字典的键
id1 = id(s)
s.add(2)
s.update({1, 2, 3})
print(s, id(s) == id1)  # 修改了内容,但是id保持不变,同一个对象
# 元素必须是可哈希的,所以集合中不能存放里列表或者集合本身
# s.add([1, 2, 3])  # 报错
# s.add(set([1, 2, 3]))  # 存放集合本身也不行
# 不可变类型
# 修改内容的时候,会生成新对象,原对象保持不变.
# 每次修改的操作实际上是创建了一个具有新内容的对象,旧的对象内存地址(ID)不会改变,但是赋值后的变量指向
# 新地址
# 可变list
myList = [1, 2, 3]
id1 = id(myList)
myList.extend(range(4, 5, 6))
print(myList, id(myList) == id1)

# 不可变类型tuple
myTuple = (1, 2, 3)
id1 = id(myTuple)
myTuple += (4, 5, 6)
print(id(myTuple) == id1)  # id不同

"""
可变不可变的核心理解:
内容发生改变时是否会创建新的对象.
可变指的就是内容在同一个地址中可以被修改,而不可变就是指的是每次修改内容的时候都会创建新的对象,内容在
同一个地址中不可以被修改.
"""
